/* Autore: Nicola Agosti */
/*
Scrivi un programma che legga un file di testo chiamato "28 - Statistiche di un file di testo - File.txt" e ne visualizzi le statistiche:
 - numero di caratteri;
 - numero di parole;
 - numero di righe.

 N.B. Si suppone che una riga non sia più lunga di 999 caratteri.
*/

#define _CRT_SECURE_NO_WARNINGS /* Necessario se utilizziamo Visual Studio */

#include <stdio.h>
#include <stdlib.h>

int main()
{
	/* Variabili di supporto al programma */
	char car, str[1000];

	/* Variabili che conterranno le statistiche */
	int numCaratteri = 0, numParole = 0, numRighe = 0;

	/* Dichiarazione del puntatore al file: è la variabile che ci permette di accedere al file. */
	/* Come per tutti i puntatori è sempre meglio inizializzarli subito a NULL */
	FILE* fp = NULL;

	/* Apro il file */
	/*
	Prima di poter accedere ad un file quest'ultimo deve essere "aperto", cioè devo ottenere un puntatore a tale file.
	
	Per aprire un file si usa la funzione "fopen(file, modalità_di_apertura)":
	 - "file" è una stringa che contiene il solo nome del file o l'intero percorso (assoluto o relativo);
	 - "modalità_di_apertura" è una stringa che contiene una delle modalità di apertura del file:
	    - "r" = il file deve esistere e viene aperto in sola lettura;
		- "w" = il file viene aperto (ed eventualmente creato) in scrittura eliminandone, se presente, tutto il contenuto;
		- "a" = il file viene aperto (ed eventualmente creato) in "aggiunta" preservandone, se presente, tutto il contenuto;
		- "r+" = come la modalità "r" ma con la possibilità anche di scrivere nel file;
		- "w+" = come la modalità "w" ma con la possibilità anche di leggere il file;
		- "a+" = come la modalità "a" ma con la possibilità anche di leggere il file.
	 - il valore di ritorno è la costante NULL se l'apertura fallisce, il puntatore al file altrimenti.

	I file devono essere SEMPRE chiusi prima di terminare il programma utilizzndo la funzione "fclose(fp)" dove "fp" è il
	puntatore al file "creato" dalla fopen.

	N.B. I file vengono "normalmente" letti in modo sequenziale... dall'inizio alla fine.
	*/
	fp = fopen("28 - Statistiche di un file di testo - File.txt", "r");

	/* Controllo che l'apertura del file sia andata a buon fine */
	if (fp == NULL)
	{
		printf("\nERORRE: impossibile aprire il file!");
		return -1;
	}

	/* Numero di caratteri contenuti nel file */
	/*
	Per leggere il contenuto di un file un carattere per volta si usa la funzione "fgetc(fp)" 
	che ritorna il carattere letto (una variabile di tipo "char") o la costante EOF (End Of File) se non
	ci sono più caratteri da leggere.
	*/
	while ((car = fgetc(fp)) != EOF)
	{
		/* Aggiorno il numero di caratteri letti */
		numCaratteri++;
	}

	/*
	Visto che sono arrivato alla fine del file devo tornare all'inizio dello stesso prima di poter proseguire.
	Per fare ciò si utilizza la funzione "rewind(fp)".
	*/
	rewind(fp);

	/* Numero di parole contenute nel file */
	/*
	Per leggere il contenuto di un file una parola per volta si usa la funzione "fscanf" (una variante della classica "scanf")
	che ritorna anch'essa la costante EOF (End Of File) se non ci sono più parole da leggere.
	*/
	while (fscanf(fp, "%s", str) != EOF)
	{
		/* Aggiorno il numero di parole lette */
		numParole++;
	}

	/* Ritorno all'inizio del file */
	rewind(fp);

	/* Numero di righe contenute nel file */
	/*
	Per leggere il contenuto di un file una riga per volta si usa la funzione "fgets" (che consciamo già)
	che ritorna, a differenza delle funzioni precedenti, NULL se non ci sono più righe da leggere.
	*/
	while (fgets(str, 1000, fp) != NULL)
	{
		/* Aggiorno il numero di parole lette */
		numRighe++;
	}

	/* Visualizzo le statistiche */
	printf("STATISTICHE");
	printf("\nNumero di caratteri (compresi gli \'\\n\'): %d", numCaratteri);
	printf("\nNumero di parole: %d", numParole);
	printf("\nNumero di righe (comprese le righe vuote): %d", numRighe);
	printf("\n");

	/* Chiudo il file */
	fclose(fp);
	
	return 0;
}